package cn.well.cloud.base;

import cn.well.cloud.base.wechat.api.impl.TemplateMessage;
import cn.well.cloud.base.wechat.model.NoticeInfo;
import cn.well.cloud.modular.model.UserInfo;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadTest2 {

    /**
     * 通过线程池方式发送通知
     */
    public static void createSendNoticePool(NoticeInfo noticeInfo, List<UserInfo> userList, String token){
        //使用Executors工具类中的方法创建线程池
        ExecutorService pool = Executors.newFixedThreadPool(5);

        ThreadTest2.sendNoticeThread demo = new ThreadTest2.sendNoticeThread(noticeInfo, userList,token);

        //为线程池中的线程分配任务,使用submit方法，传入的参数可以是Runnable的实现类，也可以是Callable的实现类
        for(int i=1;i<=5;i++){
            pool.submit(demo);
        }

        //关闭线程池
        //shutdown ： 以一种平和的方式关闭线程池，在关闭线程池之前，会等待线程池中的所有的任务都结束，不在接受新任务
        //shutdownNow ： 立即关闭线程池
        pool.shutdown();
    }

    /**
     * 发送通知线程
     */
    static class sendNoticeThread implements Runnable {

        /**
         * 构造方法传参,要发送的用户集合
         */
        private  List<UserInfo> userList;
        /**
         * 构造方法传参,要发送的课程信息
         */
        private NoticeInfo noticeInfo ;
        /**
         * 构造方法传参,接口调用凭证
         */
        private String token ;
        /**
         * 多线程的共享数据
         */
        private int i = 0;
        private String flag;
        /**
         * 模板消息工具
         */
        private TemplateMessage templateMessage = new TemplateMessage();

        public sendNoticeThread(NoticeInfo noticeInfo, List<UserInfo> userList,String token) {
            this.noticeInfo =noticeInfo;
            this.userList =userList;
            this.token = token;
        }

        @Override
        public void run() {
            while (i < userList.size()) {
                System.out.println("修改前："+i);
                synchronized(this){
                    i++;
                }

                System.out.println(Thread.currentThread().getName() + "---" + i+"   当前用户数："+userList.size());
                String openId = userList.get(i).getOpenId();
                NoticeInfo newNoticeInfo = new NoticeInfo();
                newNoticeInfo = this.noticeInfo;
                newNoticeInfo.setTouser(openId);
                Object object = null;

                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

//                    object =  templateMessage.sendTempMessage(token, noticeInfo);

//                System.out.println(Thread.currentThread().getName() + "---" + i++);

            }
        }
    }


    public static void main(String[] args){
        NoticeInfo noticeInfo = new NoticeInfo();
        noticeInfo.setUrl("123");
        List<UserInfo> userList = new ArrayList<UserInfo>();
        UserInfo u = new UserInfo();
        u.setOpenId("123445667");
        u.setUserInfoName("wo");
        userList.add(u);

        UserInfo u5 = new UserInfo();
        u5.setOpenId("123445667");
        u5.setUserInfoName("wo");
        userList.add(u5);

        UserInfo u4 = new UserInfo();
        u4.setOpenId("123445667");
        u4.setUserInfoName("wo");
        userList.add(u4);

        UserInfo u3 = new UserInfo();
        u3.setOpenId("123445667");
        u3.setUserInfoName("wo");
        userList.add(u3);

        UserInfo u2 = new UserInfo();
        u2.setOpenId("123445667");
        u2.setUserInfoName("wo");
        userList.add(u2);


        String token ="12";
        createSendNoticePool( noticeInfo,  userList,  token);
    }
}
